package java_thinking.unit_9._9_3;

import java.util.Arrays;

/**
 * @Description : 策略设计模式：创建一个能够根据所传递的参数对象的不同而执行不同行为的方法；
 *                这类方法包含所要执行算法中固定不变的部分，而策略包含变化的部分，策略就是传递进去的参数对象
 *                它包含要执行的代码。
 *                这里Processor对象就是一个策略，在main中可以看到有三种不同类型的策略应用到了String类型的s对象上
 * @author: cww
 * @DateTime: 2019-03-03 10:25
 */

public class Processor {
    public String name(){
        return getClass().getSimpleName();
    }
    Object process(Object input){
        return input;
    }
}

class UpCase extends Processor{
    @Override
    String process(Object o){
        //向下转型返回字符串大写
        return ((String)o).toUpperCase();
    }
}

class Downcase extends Processor {
    @Override
    String process(Object o){
        return ((String)o).toLowerCase();
    }
}

class Splitter extends Processor {
    @Override
    String process(Object o){
        return Arrays.toString(((String)o).split(" "));
    }
}

class Apply {
    public static void process(Processor p,Object s){
        System.out.println("Using Processor "+p.name());
        System.out.println(p.process(s));
    }
    public static String s = "Disagreement with beliefs is by definition incorrect";
    public static void main(String[] args){
        process(new UpCase(),s);
        process(new Downcase(),s);
        process(new Splitter(),s);
    }
}
